package com.zsrt.exam.client;


import java.security.NoSuchAlgorithmException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

import com.zsrt.exam.entity.UserEntity;
import com.zsrt.exam.service.UserService;
import com.zsrt.exam.utils.Util;

public class EaxmClient {
	
	
	public static void main(String[] args) throws NoSuchAlgorithmException {
		
		//1学生和管理员登陆入口
		UserService service=new UserService();
		
		
		//2 拿到所有的考生 
		List<UserEntity> userList = service.getAllUsers();
		
		Scanner sc=new Scanner(System.in);
		
		
		//3选择角色登陆
		enterFirstMenu(sc,service,userList);
		
		
		
		//4管理员进行功能选择
		while(true){
			
			service.enterAdminMenu();
			System.out.println("选择要使用的功能：");
			int a=sc.nextInt();
			
			//1 进入第一层管理员菜单
			enterSecondeMenu(a, sc, service, userList);
		}
	
	}
	
	
	
	
	/**
	 * 管理员第二层菜单操作
	 * @param a
	 * @param sc
	 * @param service
	 * @param userList
	 * @throws NoSuchAlgorithmException 
	 */
	public static void enterSecondeMenu(int a,Scanner sc,UserService service,List<UserEntity> userList) throws NoSuchAlgorithmException{
		
		while(true){
		
			if(11==a){
				//录入考生信息
				//1 增加1个考生  
				System.out.println("请输入考生的姓名...");
				String name = sc.next();
				
				System.out.println("请输入考生的准考证号码...");
				String card = sc.next();
				
				System.out.println("请输入考生的理综的成绩...");
				int other = sc.nextInt();
				
				UserEntity user=service.addUser(name,card,other);
				
				userList.add(user);
				Util.printList(userList);
				System.out.println();
				System.err.println("=====================录入成绩成功。你录入的考生信息为:"+ user);
				break;
				
			}else if(12==a){
				//修改考生信息
				System.err.println("修改前==========");
				Util.printList(userList);
				System.out.println("请输入要修改的考生的准考证号码");
				String a1=sc.next();
				System.out.println("请输入考生的省份");
				String pro=sc.next();
				System.out.println("请输入考生的城市");
				String city=sc.next();
				boolean f = service.updete(a1, userList, pro, city);
				
				if(f){
					System.out.println("更新成功");
				}else{
					System.out.println("更新失败");
				}
				
				System.err.println("修改后==========");
				System.out.println();
				Util.printList(userList);
				break;
				
				
			}else if(13==a){
				
				//删除一个考生
				System.out.println("请输入要删除的考生的准考证号码");
				String searchCard = sc.next();
				System.err.println("删除前==========");
				Util.printList(userList);
				
				Boolean f = service.delete(searchCard, userList);
				
				if(f){
					System.out.println("删除成功");
				}else{
					System.out.println("删除失败");
				}
				
				System.err.println("删除后==========");
				System.out.println();
				Util.printList(userList);
				break;
				
			}else if(14==a){
				//关键字查询考生
				searchUserMenu(sc,service,userList);
				break;
				
			}else if(15 == a){
				
				//1 打印目前所有的考生信息
				Util.printList(userList);
				break;
			}else if(16 == a){
				
				enterFirstMenu(sc,service,userList);
				break;
				
			}else{
				System.out.println("输入有误");
				break;
			}
			
			
			
		}
	}
	
	
	/**
	 * 管理员第二层管理员菜单
	 * @param sc
	 * @param service
	 * @param userList
	 */
	public static void searchUserMenu(Scanner sc,UserService service,List<UserEntity> userList){
		
		//查询考生信息 调出新的菜单
		
		System.err.println("\t\t _____________________________");
		System.err.println("\t\t        欢迎登陆高考成绩自主查询系统        ");
		System.err.println("\t\t —————————————————————————————");
		System.err.println("\t\t          1 根据城市查询                ");
		System.err.println("\t\t          2 根据姓名查询            ");
		System.err.println("\t\t          3 根据准考证号码查询   ");
		System.err.println("\t\t          4 返回上一层                 ");
		System.err.println("\t\t —————————————————————————————");
		
		int b=sc.nextInt();
		if(b!=4){
			
			System.err.println("输入要查找的城市/名字/准考证号");
			String keyWord=sc.next();
			List<UserEntity> f = service.findBykeyWord(b, keyWord, userList);
			
			System.err.println("查找到的结果是：");
			System.out.println();
			Util.printList(f);
			
		}else{
			
			//返回上级菜单
			service.enterAdminMenu();
		}
	}
	
	
	
	/**
	 * 进入登陆菜单
	 * @param menu
	 * @param sc
	 * @param ser
	 * @throws NoSuchAlgorithmException 
	 */
	public static void enterFirstMenu(Scanner sc,UserService ser,List<UserEntity> userList) throws NoSuchAlgorithmException{
		
		while(true){
			ser.login();
			int menu=sc.nextInt();
			//1 进入一级菜单 管理员 
			if(menu==1){
				System.out.println("请输管理员姓名");
				String name = sc.next();
				System.out.println("请输入管理员密码");
				String password = sc.next();
				
				//从UserEntity中拿到管理员的名字和密码
				
				UserEntity ad = ser.getAdmin();
				if(name.equals(ad.getName()) && Util.stringMD5(password).equals(ad.getPassword())){
					System.out.println("登陆成功啦");
					break;
					
				}else{
					System.out.println("登陆失败");
					
				}
				
				
				//学生登陆
			}else if(menu==2){
				while(true){
				
					System.out.println("请输入准考证：");
					String name = sc.next();
					System.out.println("请输入密码");
					String password = sc.next();
					
					for(int i=0;i<userList.size();i++){
						String n = userList.get(i).getCard();
						String p = userList.get(i).getPassword();
						
						if(name.equals(n) && Util.stringMD5(password).equals(p)){
							System.out.println("登陆成功");
							System.out.println();
							getUserMenu(name,ser,userList);
							
						}
					}
					System.out.println("登录失败");
					System.out.println();
				
				}
			}else if(menu==3){
				System.out.println("退出程序");
				break;
				
			}else{
				System.out.println("输入有误");
				
			}
		
		}
		
	}
	
	public static void getUserMenu(String cardNum,UserService service,List<UserEntity> userList) throws NoSuchAlgorithmException{
		
		while(true){
			
		
			System.err.println("\t\t _____________________________");
			System.err.println("\t\t        欢迎登陆高考成绩自主查询系统        ");
			System.err.println("\t\t —————————————————————————————");
			System.err.println("\t\t          21 我的信息                 ");
			System.err.println("\t\t          22 查询本市(登录用户所在的城市)的总分状元             ");
			System.err.println("\t\t          23 查询全国各个省份的状元                       ");
			System.err.println("\t\t          24 查询指定城市的状元                     ");
			System.err.println("\t\t          25 查询各个省份500<=x<=600分的总人数并由高到低排列显示");
			System.err.println("\t\t          26 查询各个省份x>600超过600分的总人数并由低到高排列显示");
			System.err.println("\t\t          27返回上一层");
			System.err.println("\t\t —————————————————————————————");
			
			Scanner sc=new Scanner(System.in);
			System.out.println("选择功能：");
			int menu=sc.nextInt();
			if(21==menu){
				
				//我的信息
				service.seeOneself(cardNum, userList);
				
				
			}else if(22==menu){
				//查询本市(登录用户所在的城市)的总分状元
				
				UserEntity cityTop1 = service.cityTop1(cardNum, userList);
				System.out.println("城市["+cityTop1.getCity()+"]的状元郎的具体信息是:"+cityTop1);
				
			}else if(23==menu){
				
				//查询全国各个省份的状元 
				service.provinceTop(userList);
				
			}else if(24==menu){
				
				//查询指定城市的状元
				System.out.println("输入城市名：");
				String cityName=sc.next();
				UserEntity targerCityTop1 = service.targerCityTop1(cityName, userList);
				System.out.println("城市["+targerCityTop1.getCity()+"]的状元郎的具体信息是:"+targerCityTop1);
				
			}else if(25==menu){
				
				//查询各个省份500<=x<=600分的总人数并由高到低排列显示
				service.statistics(userList);
				
			}else if(26==menu){
				
				//查询各个省份x>600超过600分的总人数并由低到高排列显示
				Map<String, List<UserEntity>> pro = service.findAllUsersByProvince(userList);
				
				Set<Entry<String, List<UserEntity>>> entrySet = pro.entrySet();
				
				Iterator<Entry<String, List<UserEntity>>> it = entrySet.iterator();
				while(it.hasNext()){
					
					Entry<String, List<UserEntity>> key = it.next();
					String k = key.getKey();
					List<UserEntity> v = key.getValue();
					System.out.println(k+"省"+":"+v);
				}
			}else if(27==menu){
				
				enterFirstMenu(sc,service,userList);
				
			}else{
				System.out.println("输入有误");
			}
		}	
	}

}


